/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package frontera.dao;

import control.SIRHApp;
import entidad.CambiosPrestacion;
import entidad.Prestacion;
import java.util.ArrayList;
import java.util.Calendar;
import javax.persistence.EntityManager;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author tuareg
 */
public class PrestacionDAO  extends DAOT<Prestacion> {

	public PrestacionDAO(String nombreEntidad) {
		super(nombreEntidad);
	}

	public PrestacionDAO() {
		this("Prestacion");
	}
        
        @Override
        public boolean crear(Prestacion nuevaEntidad) {
		boolean retorno = false;
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();

                CambiosPrestacion cambiosTMP = new CambiosPrestacion();
                cambiosTMP.getCambios().add(nuevaEntidad);
                nuevaEntidad.setCambiosPrestacion(cambiosTMP);
		nuevaEntidad.setUltimaVersion(true);
                SIRHApp.getInstance().getDAOCamPrestacion().crear(cambiosTMP);

		try {
			em.persist(nuevaEntidad);
			em.getTransaction().commit();
			retorno = true;
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			em.close();
			return retorno;
		}
	}        
        
	@Override
	public boolean actualizar(Prestacion viejaEntidad, Prestacion nuevaEntidad) {
            EntityManager em = emf.createEntityManager();
            em.getTransaction().begin();
            boolean ret= false;
            try {
                if(SIRHApp.getInstance().getAdmCambios().verificarFecha(viejaEntidad.getFechaDeModificacion(), 
                                                                        nuevaEntidad.getFechaDeModificacion())){
                    viejaEntidad = leer(viejaEntidad);
                    viejaEntidad.setNombre(nuevaEntidad.getNombre());
                    viejaEntidad.setPorcentajeCompañia(nuevaEntidad.getPorcentajeCompañia());
                    viejaEntidad.setPorcentajeEmpleado(nuevaEntidad.getPorcentajeEmpleado());
                    viejaEntidad.setFechaDeModificacion(nuevaEntidad.getFechaDeModificacion());
                    em.merge(viejaEntidad);
                    em.getTransaction().commit();
                    ret = true;
                }
                else{
                    try {
                            nuevaEntidad.setCambiosPrestacion(viejaEntidad.getCambiosPrestacion());
                            viejaEntidad = leer(viejaEntidad);
			    nuevaEntidad.setUltimaVersion(true);
			    viejaEntidad.setUltimaVersion(false);
                            em.merge(viejaEntidad);
                            em.persist(nuevaEntidad);
                            em.getTransaction().commit();
                            ret = true;
                    } catch (Exception e) {
                            e.printStackTrace();
                            em.getTransaction().rollback();
                    }
                }
            } catch (Exception e) {
                em.getTransaction().rollback();
            } finally {
                em.close();
                return ret;
            }
	}
        
        public Prestacion leer(Prestacion par) {
            EntityManager em = emf.createEntityManager();
            Prestacion prestacion = null;

            Query q = em.createQuery(   "SELECT p FROM Prestacion p " +
                                        "WHERE p.ID = :ID")
                                        .setParameter("ID", par.getID());
            try {
                prestacion = (Prestacion)q.getSingleResult();
            } catch (NonUniqueResultException e){
                prestacion = (Prestacion)q.getResultList().get(0);
            } catch (Exception e){
                e.printStackTrace();
            }finally {
                em.close();
                return prestacion;
            }
        }
        
        public ArrayList<Prestacion> getCambiosID(long ID,Calendar fecha){
            EntityManager em = emf.createEntityManager();
            ArrayList<Prestacion> cambios = null;
            
            Query q = em.createQuery(   "SELECT e FROM Prestacion e " +
                                        "WHERE e.cambiosPrestacion.id = :CAMBIOSPRESTACION_ID AND "
                                        + "e.fechaDeModificacion <= :FECHA")
                                        .setParameter("CAMBIOSPRESTACION_ID",ID)
                                        .setParameter("FECHA", fecha);
            try {                       
                cambios = (ArrayList<Prestacion>) q.getResultList();
            } catch (Exception e){
                e.printStackTrace();
            }finally {
                em.close();
                return cambios;
            }
        }
        
        public Prestacion getMinimaFecha(){
            EntityManager em = emf.createEntityManager();
            Prestacion cambios = null;
            
            Query q = em.createQuery(   "SELECT p FROM Prestacion p "+
                                        "WHERE p.fechaDeModificacion=(SELECT MIN(p.fechaDeModificacion) FROM p)");
            try {                       
                cambios = (Prestacion) q.getSingleResult();
            } catch (NonUniqueResultException e) {
                cambios = (Prestacion) q.getResultList().get(0);
            } catch (Exception e){
                e.printStackTrace();
            }finally {
                em.close();
                return cambios;
            }
        }
        
}
